home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / Sample.bin / SimpleJdbcTableModel.java < prev    next >
Text File  |  1998-09-27  |  8KB  |  280 lines

  1. import com.sun.java.swing.table.*;
  2.  
  3. import java.io.*;
  4. import java.beans.*;
  5. import java.sql.*;
  6. import java.util.*;
  7.  
  8. public class SimpleJdbcTableModel extends com.sun.java.swing.table.AbstractTableModel implements java.io.Serializable
  9. {
  10.     String jdbcDriverClass=null;
  11.     String jdbcDriverURL=null;
  12.     String query=null;
  13.     String user=null;
  14.     String password=null;
  15.     
  16.     String[] columnNames = {};
  17.     Class[] columnTypes = {};
  18.     boolean[] columnWrite = {};
  19.     
  20.     Vector rows = new Vector();
  21.  
  22.  
  23.     public SimpleJdbcTableModel()
  24.     {
  25.     }
  26. //internal functions
  27.     Class columnTypeToColumnClass(int type)
  28.     {
  29.         switch(type) 
  30.         {
  31.         case Types.CHAR:
  32.         case Types.VARCHAR:
  33.         case Types.LONGVARCHAR:
  34.             return String.class;
  35.  
  36.         case Types.BIT:
  37.             return Boolean.class;
  38.  
  39.         case Types.TINYINT:
  40.         case Types.SMALLINT:
  41.         case Types.INTEGER:
  42.             return Integer.class;
  43.  
  44.         case Types.BIGINT:
  45.             return Long.class;
  46.  
  47.         case Types.FLOAT:
  48.         case Types.DOUBLE:
  49.             return Double.class;
  50.  
  51.         case Types.DATE:
  52.             return java.sql.Date.class;
  53.  
  54.         default:
  55.             return Object.class;
  56.         }
  57.     }
  58.  
  59.     public void doQuery()
  60.     {
  61.         Connection connection;
  62.         Statement statement;
  63.         ResultSet resultSet;
  64.         ResultSetMetaData metaData;
  65.         try 
  66.         {
  67. //get connection
  68.             Class.forName(jdbcDriverClass);
  69.             System.out.println("Opening db connection");
  70.  
  71.             connection = DriverManager.getConnection(jdbcDriverURL, user, password);
  72.             statement = connection.createStatement();
  73. //get data
  74.             resultSet = statement.executeQuery(query);
  75.             metaData = resultSet.getMetaData();
  76.  
  77.             int numberOfColumns =  metaData.getColumnCount();
  78.             columnNames = new String[numberOfColumns];
  79.             columnTypes = new Class[numberOfColumns];
  80.             columnWrite = new boolean[numberOfColumns];
  81.             // Get the column names/types and cache them.
  82.             // Then we can close the connection.
  83.             for(int column = 0; column < numberOfColumns; column++) 
  84.             {
  85.                 columnNames[column] = metaData.getColumnLabel(column+1);
  86.                 columnTypes[column] = columnTypeToColumnClass(metaData.getColumnType(column+1));
  87.                 columnWrite[column] = !metaData.isReadOnly(column+1);
  88.             }
  89.  
  90.             // Get all rows.
  91.             rows = new Vector();
  92.             while (resultSet.next()) 
  93.             {
  94.                 Vector newRow = new Vector();
  95.                 for (int i = 1; i <= getColumnCount(); i++) 
  96.                 {
  97.                 newRow.addElement(resultSet.getObject(i));
  98.                 }
  99.                 rows.addElement(newRow);
  100.             }
  101.             resultSet.close();
  102.             statement.close();
  103.             connection.close();
  104.             
  105.             fireTableChanged(null); // Tell the listeners a new table has arrived.
  106.         }
  107.         catch (ClassNotFoundException ex) 
  108.         {
  109.             System.err.println("Cannot find the database driver classes.");
  110.             ex.printStackTrace();
  111.         }
  112.         catch (SQLException ex) 
  113.         {
  114.             System.err.println("Cannot connect to this database.");
  115.             ex.printStackTrace();
  116.         }
  117.     }
  118.  
  119.     Object getColumnSafeValue(Object val, int col)
  120.     {
  121.         if((val==null) || (val.getClass().equals(columnTypes[col])))
  122.         {
  123.             return val;
  124.         }
  125.         else if(columnTypes[col].equals(String.class))
  126.         {
  127.             return String.valueOf(val);
  128.         }
  129.         else if(columnTypes[col].equals(Double.class))
  130.         {
  131.             if(val.getClass().getSuperclass().equals(Number.class))
  132.             {
  133.                 return new Double(((Number)val).doubleValue());
  134.             }
  135.             else if (val.getClass().equals(String.class))
  136.             {
  137.                 return Double.valueOf((String)val);
  138.             }
  139.         }
  140.         else if(columnTypes[col].equals(Integer.class))
  141.         {
  142.             if(val.getClass().getSuperclass().equals(Number.class))
  143.             {
  144.                 return new Integer(((Number)val).intValue());
  145.             }
  146.             else if (val.getClass().equals(String.class))
  147.             {
  148.                 return Integer.valueOf((String)val);
  149.             }
  150.         }
  151.         else if(columnTypes[col].equals(Long.class))
  152.         {
  153.             if(val.getClass().getSuperclass().equals(Number.class))
  154.             {
  155.                 return new Long(((Number)val).longValue());
  156.             }
  157.             else if (val.getClass().equals(String.class))
  158.             {
  159.                 return Long.valueOf((String)val);
  160.             }
  161.         }
  162.         else if(columnTypes[col].equals(Boolean.class))
  163.         {
  164.             if(val.getClass().getSuperclass().equals(Number.class))
  165.             {
  166.                 return new Boolean(((Number)val).intValue() == 0 ? false : true);
  167.             }
  168.             else if (val.getClass().equals(String.class))
  169.             {
  170.                 return Boolean.valueOf((String)val);
  171.             }
  172.         }
  173.         else if(columnTypes[col].equals(java.util.Date.class))
  174.         {
  175.             try
  176.             {
  177.                 return java.text.DateFormat.getInstance().parse(String.valueOf(val));
  178.             }
  179.             catch(java.text.ParseException p)
  180.             {
  181.                 p.printStackTrace();
  182.             }
  183.         }
  184.         //failing all else
  185.         System.out.println(columnTypes[col]);
  186.         return val;
  187.     }
  188.  
  189. //Properties:
  190.     public void setJdbcDriverClass(String jdbcDriverClass)
  191.     {
  192.         this.jdbcDriverClass = jdbcDriverClass;
  193.     }
  194.     public String getJdbcDriverClass()
  195.     {
  196.         return jdbcDriverClass;
  197.     }
  198.     
  199.     public void setJdbcDriverURL(String driverURL)
  200.     {
  201.         jdbcDriverURL=driverURL;
  202.     }
  203.     public String getJdbcDriverURL()
  204.     {
  205.         return jdbcDriverURL;
  206.     }
  207.     
  208.     public void setQuery(String theQuery)
  209.     {
  210.         query =  theQuery;
  211.     }
  212.     public String getQuery()
  213.     {
  214.         return query;
  215.     }
  216.     
  217.     public void setUser(String user)
  218.     {
  219.         this.user = user;
  220.     }
  221.     public String getUser()
  222.     {
  223.         return user;
  224.     }
  225.     
  226.     public void setPassword(String pass)
  227.     {
  228.         password=pass;
  229.     }
  230.     public String getPassword()
  231.     {
  232.         return password;
  233.     }
  234.  
  235. //TableModel implementation:
  236.     public String getColumnName(int column)
  237.     {
  238.         return columnNames[column] == null ? "" : columnNames[column];
  239.     }
  240.     
  241.     public Class getColumnClass(int column)
  242.     {
  243.         return columnTypes[column];
  244.     }
  245.     
  246.     public boolean isCellEditable(int row, int column)
  247.     {
  248.         return columnWrite[column];
  249.     }
  250.     
  251.     public int getRowCount()
  252.     {
  253.         return rows.size();
  254.     }
  255.  
  256.     public int getColumnCount()
  257.     {
  258.         return columnNames.length;
  259.     }
  260.  
  261.     public Object getValueAt(int rowIndex, int columnIndex)
  262.     {
  263.         try
  264.         {
  265.             return ((Vector)rows.elementAt(rowIndex)).elementAt(columnIndex);
  266.         }
  267.         catch(Exception e)
  268.         {
  269.             e.printStackTrace();
  270.             return null;
  271.         }
  272.     }
  273.     //note, setValueAt does not actually edit the back-end (just edits the data in memory).  It would be fairly simple to
  274.     //add such functionality should it become necessary.
  275.     public void setValueAt(Object value, int row, int column)
  276.     {
  277.         Object val=getColumnSafeValue(value, column);
  278.         ((Vector)rows.elementAt(row)).setElementAt(val, column);
  279.     }
  280. }